﻿using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System;
using System.Data;
using System.IO;

namespace ExportExcel
{
    class ExportExcel
    {
        public void exportExcel() {
            DataTable dt = getData();
            Export(dt);
        }

        /// <summary>
        /// 导出通用方法
        /// </summary>
        /// <param name="dt"></param>
        private void Export(DataTable dt)
        {

            // 一个sheet最大输出行数
            int sheetMaxSize = 10;
            // 当前sheet的输出行数
            int sheetSize = 0;
            // 当前sheet页的总数（用于定义sheet名）
            int sheetCnt = 1;

            HSSFWorkbook workbook = new HSSFWorkbook();
            ISheet sheet = workbook.CreateSheet("sheet" + sheetCnt);

            foreach (DataRow dr in dt.Rows)
            {
                if (sheetSize == sheetMaxSize)
                {
                    // 当前sheet行数等于最大限制行数后，设置sheet页格式
                    autoColumnSize(sheet, dt.Columns.Count);

                    // 创建新的sheet
                    sheetCnt++;
                    sheet = workbook.CreateSheet("sheet" + sheetCnt);

                    // 当前sheet行数清零
                    sheetSize = 0;
                }

                if (sheetSize == 0)
                {
                    // 新sheet页，第一次输出时，设置标题内容
                    IRow row = sheet.CreateRow(sheetSize);

                    row.CreateCell(0).SetCellValue("订单号");
                    row.CreateCell(1).SetCellValue("收货地址");
                    row.CreateCell(2).SetCellValue("收货人");
                    row.CreateCell(3).SetCellValue("配送车辆");
                    row.CreateCell(4).SetCellValue("产品");

                    // 标题设置完成，行数 + 1
                    sheetSize++;
                }

                // 输出DataRow内容到Excel
                IRow iRow = sheet.CreateRow(sheetSize);
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    ICell cell = iRow.CreateCell(i, CellType.String);
                    if (i == 1)
                    {
                        // 第二列需要换行处理
                        String strTemp = Convert.ToString(dr[i]);
                        strTemp = strTemp.Replace("<br/>", "\n");
                        ICellStyle cs = workbook.CreateCellStyle();
                        cs.WrapText = true;
                        cell.CellStyle = cs;

                        cell.SetCellValue(strTemp);
                    }
                    else
                    {
                        cell.SetCellValue(Convert.ToString(dr[i]));
                    }
                }
                
                // 输出一行，当前sheet行数+1。
                sheetSize++;
            }

            // 为最后一个sheet页设置格式
            autoColumnSize(sheet, dt.Columns.Count);

            // 生成Excel
            using (var fs = File.OpenWrite(@"C:/demo.xls"))
            {
                workbook.Write(fs);
            }

        }

        private void autoColumnSize(ISheet sheet, int columnCnt)
        {
            for (int i = 0; i < columnCnt; i++)
            {
                // 自适应宽度
                sheet.AutoSizeColumn(i);
            }
        }

        private DataTable getData()
        {
            DataTable dt = new DataTable();

            DataColumn dc = new DataColumn("name", Type.GetType("System.String"));
            dt.Columns.Add(dc);

            dc = new DataColumn("cmts", Type.GetType("System.String"));
            dt.Columns.Add(dc);

            DataRow dr;

            for (int i = 0; i < 25; i++)
            {
                dr = dt.NewRow();
                dr["name"] = "namenamenamenamenamenamenamename" + i;
                dr["cmts"] = "第一项<br/>第二二二二二二二二二二二二二项<br/>第三项";

                dt.Rows.Add(dr);
            }

            return dt;
        }
    }
}
